/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.manager;

import com.brain.comp.dto.DocumentoCompraDetaDto;
import com.brain.comp.dto.DocumentoCompraDto;
import com.brain.comp.dto.PedidoCompraDetaDto;
import com.brain.comp.dto.PedidoCompraDto;
import com.brain.comp.dto.PlanPagoDto;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.manager.*;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.dto.TarifaDto;
import com.brain.conf.dto.TarifaProductoDto;
import com.brain.conf.dto.TerceroDireccionDto;
import com.brain.conf.dto.TerceroDto;
import com.brain.conf.dto.TipoCambioDto;
import com.brain.conf.view.util.ConstantesConf;
import com.brain.core.common.ExportarExcelCompras;
import com.brain.core.view.util.ConstantesCore;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.inve.view.util.ConstantesInve;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class DocumentoCompraManager extends ComunManager<DocumentoCompraDto> implements Serializable {

    private static Logger logger = Logger.getLogger(DocumentoCompraManager.class);
    private Long idEntidad = 173L;
    @Resource
    private DAOGenerico<DocumentoCompraDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ParametroManager parametroManager;
    @Resource
    private ApplicationMBean applicationMBean;
    private final String url = "/pages/comp/documentoCompra/documentoCompra.xhtml";
    private final String urlLista = "/pages/comp/documentoCompra/listaDocumentosCompra.xhtml";
    private final String urlListaPedidos = "/pages/comp/documentoCompra/listaPedidoCompraConfirmados.hxtml";
    private final String urlCont = "/pages/comp/documentoCompra/documentoCompraCont.xhtml";
    private final String urlListaCont = "/pages/comp/documentoCompra/listaDocumentosCompraCont.xhtml";

    /**
     * obtener Documento de Compra por Id
     *
     * @param id
     * @return Documento de Compra
     * @throws DAOException
     */
    public DocumentoCompraDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(DocumentoCompraDto.class, id);
    }

    /**
     * Metodo para inicializar nuevo Documento de Compra
     *
     * @return
     */
    public DocumentoCompraDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        DocumentoCompraDto dto = new DocumentoCompraDto();
        dto.setDocumentoTransaccion(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_FAC);
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setProveedorDto(new TerceroDto());
        dto.setFormaPagoDto(new ParametroDto());
        dto.setCondicionPagoDto(new CondicionPagoDto());
        dto.setTarifaDto(new TarifaDto());
        dto.setFechaFactura(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setDescuento(BigDecimal.ZERO);
        dto.setDescuentoMonto(BigDecimal.ZERO);
        dto.setSubTotal(BigDecimal.ZERO);
        dto.setSubTotalConDescuento(BigDecimal.ZERO);
        dto.setImpuesto(BigDecimal.ZERO);
        dto.setImpuestoMonto(BigDecimal.ZERO);
        dto.setTotal(BigDecimal.ZERO);
        dto.setIndDetraccion(Boolean.FALSE);
        try {        
            dto.setDetraccionDto(parametroManager.obtenerPorId(ConstantesComp.Parametro.DETRACCION_DEFAULT));
        } catch (DAOException ex) {
            dto.setDetraccionDto(new ParametroDto(ConstantesComp.Parametro.DETRACCION_DEFAULT));
        }
        dto.setPorcentajeDetRet(dto.getDetraccionDto().getValorReal());
        
        //obtenemos de la ORG si es agente retenedor o no
        dto.setIndRetencion(sessionMBean.getOrganizacionDto().getIndRetenedor());
        dto.setMontoDetRet(BigDecimal.ZERO);
        if (dto.getIndRetencion()) {
            dto.setPorcentajeDetRet(sessionMBean.getOrganizacionDto().getPaisDto().getRetencion());          
        }else {
            dto.setPorcentajeDetRet(BigDecimal.ZERO);
        }
        
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
                if (sessionMBean.getOrganizacionDto().getPaisDto().getImpuestoVentas() != null) {
                    dto.setImpuesto(sessionMBean.getOrganizacionDto().getPaisDto().getImpuestoVentas());
                }
                //Obtenemos la moneda del pais de la organizacion   
                dto.setMonedaDto(sessionMBean.getOrganizacionDto().getMonedaDto());
            }
        }
        dto.setEstado(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ELABORACION);
        return dto;
    }

    /**
     * Metodo para obtener Documento de Compra segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Documentos de Compra
     * @throws DAOException
     */
    public List<DocumentoCompraDto> obtener(DocumentoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from DocumentoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaFactura between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }

        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        }


        hqsql += " order by e.fechaFactura, e.fechaCreacion  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<DocumentoCompraDto> obtenerCont(DocumentoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from DocumentoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaFactura between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }

        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        } else {
            hqsql += " and (upper(e.estado) = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO + "'";
            hqsql += " or upper(e.estado) = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONTABILIZADO + "')";
        }


        hqsql += " order by e.fechaFactura, e.fechaCreacion  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<DocumentoCompraDto> obtenerDocCompraPorPedidoCompra(PedidoCompraDto dto) throws DAOException {
        String hqsql = "select e from DocumentoCompraDto as e where e.id=e.id";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.pedidoCompraDto.id = ?";
        listaParametros.add(dto.getId());
        hqsql += " order by e.id asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<DocumentoCompraDto> obtenerGeneradosParaGuiaRemision(DocumentoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select  e from DocumentoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaFactura between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }

        hqsql += " and upper(e.estado) = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO + "'";

        //Verificamos que ningun item de este documento este en una guia de remsion con estado GENERADA
        hqsql += " and not exists(select 'X' from GuiaRemisionDetaDto as grd ";
        hqsql += " where grd.documentoCompraDetaDto.documentoCompraDto.id = e.id ";
        hqsql += " and grd.guiaRemisionDto.estado = '" + ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ELABORACION + "')";
        //Verificamos si existe algun item que aun no haya sido atendido completamente
        hqsql += " and exists(select 'X' from DocumentoCompraDetaDto as dcd";
        hqsql += " where dcd.documentoCompraDto.id = e.id and ( dcd.estado = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_DETA_COD_ESTADO_REC_PARCIAL + "' ";
        hqsql += " or dcd.estado = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_DETA_COD_ESTADO_EN_ESPERA + "') and dcd.productoDetaDto.productoDto.tipoProducto <> '" + ConstantesConf.ValoresConstantes.PRODUCTO_COD_TIPO_SERVICIO + "')";
        hqsql += " and e.pedidoCompraDto.id is null";
        hqsql += " order by e.fechaFactura, e.fechaCreacion  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<DocumentoCompraDto> obtenerDocumentosConfirmadosPorPedidoCompra(PedidoCompraDto pcDto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from DocumentoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.estado = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO + "'";
        hqsql += " and e.pedidoCompraDto.id = ?";
        listaParametros.add(pcDto.getId());
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<DocumentoCompraDto> obtenerDocumentosPorNroSerieNumero(DocumentoCompraDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from DocumentoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.nroSerie = '" + dto.getNroSerie() + "'";
        hqsql += " and e.numero = '" + dto.getNumero() + "' ";
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        if (dto.getId() != null) {
            hqsql += " and e.id <> ?";
            listaParametros.add(dto.getId());
        }
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para guardar, editar Documentos de Compra
     *
     * @param dto Documento de Compra
     * @return cadena de satisfaccion
     */
    public String contabilizar(DocumentoCompraDto dto) {
        String to = null;
        String mensajeTrx = "";
        Long contabilizacion = null;
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setTerminal(sessionMBean.getSessionTerminal());

        if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            try {
                contabilizacion = ejecutarContabilizacion(sessionMBean.getEmpresaDto().getPlanContableDto().getId(),
                                                          sessionMBean.getAnoContableDto().getId(),
                                                          sessionMBean.getMesContableDto().getId(),
                                                          dto.getId(),
                                                          sessionMBean.getSessionUsuarioDto().getId());
                if (contabilizacion <= 0) {
                     mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.conta.msj.error.contabilizar");
                     recursosManager.showError(mensajeTrx);     
                     to = null;
                }else {
                    dto.setEstado(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONTABILIZADO);
                    definirCssPorEstado(dto);
                    editar(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = "";//retroceder();
                }
               
                
            } catch (DAOException ex) {
                 mensajeTrx = ex.getMessage();
                 recursosManager.showError(ex.getMessage());
                 logger.error(mensajeTrx);

                 to = null;
            }
            
        }
        return to;
    }
    
    public Long ejecutarContabilizacion(Long idPlan,Long idAno, Long idMes, Long idDoc, Long idUsuario) {        
        Long retorno = Long.valueOf(0);
        try {
            String cadenaEjecucion = "{Call PCK_GENERA_ASIENTOS.P_GEN_ASIENTO_COMPRA(" + idPlan +","+idAno+","+idMes+","+idDoc+","+idUsuario + ")}";
            ejecutarProceso(cadenaEjecucion); 
            System.out.println("PAsa 1");
            String sql = "select pck_util_contabilidad.OBT_MSJ_GENERAL from dual";          
            String resultado = null;
            List listaResultados;
            try {
                listaResultados = springHibernateDao.ejecutarSQL(sql);
                System.out.println("PAsa 2");
                for (Iterator iter = listaResultados.iterator(); iter.hasNext();) {
                    StringTokenizer registro = new StringTokenizer(iter.next().toString(), "|");
                    resultado = registro.nextToken();
                    break;
                }
                System.out.println(resultado);
                        
                retorno = Long.valueOf(resultado);
                System.out.println("PAsa 3");
                return retorno;
            } catch (DAOException ex) {
                System.out.println("PAsa 0");
                return null;
            }
            
        } catch (Exception ex) {
            recursosManager.showError(ex.getCause().getMessage().trim());
            return null;
        }
        
        


    }

    public String guardar(DocumentoCompraDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        PedidoCompraManager pedidoCompraManager = (PedidoCompraManager) WebServletContextListener.getApplicationContext().getBean("pedidoCompraManager");
        try {
            Boolean indicador = true;
            if (dto.getOrganizacionDto() != null) {
                if (!verificarUniqueNroSerieNumero(dto)) {
                    return null;
                }
                if (dto.getPedidoCompraDto() != null) {
                    if (!verificarSubTotalParcialAtendido(dto)) {
                        indicador = false;
                    }
                }
                if (indicador) {
                    {
                        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminal(sessionMBean.getSessionTerminal());
                    }
                    definirCssPorEstado(dto);
                    if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                        dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        UtilCore.General.toUpperCaseDto(dto);
                        nuevo(dto);
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        to = "";//retroceder();

                    } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        //Antes de guardar verificamos que los detalles esten correctos
                        if (dto.getListaDetalles() != null) {
                            if (!dto.getListaDetalles().isEmpty()) {
                                for (DocumentoCompraDetaDto hijo : dto.getListaDetalles()) {
                                    if (!hijo.getIsSave()) {
                                        recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod.detalles"));
                                        return null;
                                    }
                                    UtilCore.General.toUpperCaseDto(hijo);
                                    hijo.setDocumentoCompraDto(dto);
                                }
                            }
                        }
                        //Verificamos si se va confirmar y tiene origen hay que actualizar su estado
                        if (dto.getPedidoCompraDto() != null) {
                            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)) {
                                //Calculamos segun la moneda del documento el monto atendido en la moneda del pedido de compra
                                BigDecimal cantidadTotalAtendida = BigDecimal.ZERO;
                                TipoCambioDto tcDto = obtenerTipoCambioSobreSubTotal(dto.getMonedaDto(), dto.getPedidoCompraDto().getMonedaDto());
                                if (tcDto != null) {
                                    if (!tcDto.getId().equals(-1L)) {
                                        cantidadTotalAtendida = dto.getSubTotal().multiply(tcDto.getFactor());
                                    } else {
                                        cantidadTotalAtendida = dto.getSubTotal();
                                    }
                                } else {
                                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.mensaje.error2"));
                                    return null;
                                }

                                cantidadTotalAtendida = cantidadTotalAtendida.add(dto.getPedidoCompraDto().getSubTotalAtendido());
                                PedidoCompraDto pcDto = pedidoCompraManager.obtenerPorId(dto.getPedidoCompraDto().getId());
                                if (cantidadTotalAtendida.compareTo(dto.getPedidoCompraDto().getSubTotal()) == 0) {//Atendido totalmente
                                    pcDto.setEstadoDocumento(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_AT);
                                } else if (dto.getPedidoCompraDto().getSubTotal().compareTo(cantidadTotalAtendida) > 0) {
                                    pcDto.setEstadoDocumento(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_AP);
                                }
                                pcDto.setSubTotalAtendido(cantidadTotalAtendida);
                                pedidoCompraManager.editar(pcDto);
                            }
                        }
                        UtilCore.General.toUpperCaseDto(dto);
                        editar(dto);
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        to = "";//retroceder();
                    }
                }

            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }

    public String obtenerCadenaUltimaModificacionLista(DocumentoCompraDto dto) {
        String cad = "";
        int diasDif = UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate());
        if (diasDif == 0) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hoy.a.las") + " " + sdf.format(dto.getFecha());
        } else if (diasDif == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.ayer.a.las") + " " + sdf.format(dto.getFecha());
        } else if (diasDif > 1 && diasDif < 7) {
            int diaSemana = 0;
            String diaTexto = "";
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(UtilCore.Fecha.obtenerFechaActualDate());;
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            if (calendario.get(Calendar.DAY_OF_WEEK) > diasDif) {
                diaSemana = calendario.get(Calendar.DAY_OF_WEEK) - diasDif;
            } else {
                diaSemana = 7 - Math.abs(calendario.get(Calendar.DAY_OF_WEEK) - diasDif);
            }
            diaTexto = obtenerDiaSemanaTexto(diaSemana);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.el") + " " + diaTexto + " " + sdf.format(dto.getFecha());
        } else {
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(dto.getFecha());
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hace") + " " + UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate()) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.dias");
        }
        return cad;
    }

    public String obtenerEstadoCadena(DocumentoCompraDto dto) {
        String cad = "";
        if (dto.getFecha().after(dto.getFechaCreacion())) {
            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ELABORACION)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.modificado");
            } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.anulado");
            } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.confirmado");
            }
        } else {
            cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.creado");
        }
        return cad;
    }

    public String obtenerDiaSemanaTexto(int dia) {
        String[] diasSemana = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.domingo.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.lunes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.martes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.miercoles.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.jueves.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.viernes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.sabado.a.las")
        };
        return diasSemana[dia - 1];
    }

    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")
        };
        return meses[mes];
    }

    public String revisarValidacinoesAntesDeGuardar(DocumentoCompraDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            Boolean indicador = true;
            if (dto.getOrganizacionDto() != null) {
                if (!verificarUniqueNroSerieNumero(dto)) {
                    return null;
                }
                if (dto.getPedidoCompraDto() != null) {
                    if (!verificarSubTotalParcialAtendido(dto)) {
                        indicador = false;
                    }
                }
                if (indicador) {
                    if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        //Antes de guardar verificamos que los detalles esten correctos
                        if (dto.getListaDetalles() != null) {
                            if (!dto.getListaDetalles().isEmpty()) {
                                for (DocumentoCompraDetaDto hijo : dto.getListaDetalles()) {
                                    if (!hijo.getIsSave()) {
                                        recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod.detalles"));
                                        return null;
                                    }
                                }
                            }
                        }
                        //Verificamos si se va confirmar y tiene origen hay que actualizar su estado
                        if (verificarDetalles(dto)) {
                            if (dto.getPedidoCompraDto() != null) {
                                if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)) {
                                    //Calculamos segun la moneda del documento el monto atendido en la moneda del pedido de compra
                                    TipoCambioDto tcDto = obtenerTipoCambioSobreSubTotal(dto.getMonedaDto(), dto.getPedidoCompraDto().getMonedaDto());
                                    if (tcDto != null) {
                                    } else {
                                        recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.mensaje.error2"));
                                        return null;
                                    }
                                }
                            }
                        } else {
                            return null;
                        }
                        to = "";//retroceder();
                    }
                }

            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }

    public void definirCssPorEstado(DocumentoCompraDto dto) {
        if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ELABORACION)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssElaboracion);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssAnulado);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssConfirmado);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONTABILIZADO)) {
            dto.setInlinestyle(ConstantesCore.cssColores.cssAzul);
        }
    }

    //No debe repetirse la combinacion {nroSerie-numero}
    public Boolean verificarUniqueNroSerieNumero(DocumentoCompraDto dto) {
        try {
            List<DocumentoCompraDto> lst = obtenerDocumentosPorNroSerieNumero(dto);
            if (lst != null) {
                if (!lst.isEmpty()) {
                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.mensaje.nroserie.numero.duplicado"));
                    return false;
                }
            }
        } catch (Exception ex) {
            recursosManager.showError("aqui" + ex.getMessage());
            logger.error(ex.getMessage());
        }
        return true;
    }

    public Boolean verificarDetalles(DocumentoCompraDto dto) {
        if (dto.getListaDetalles() != null) {
            if (!dto.getListaDetalles().isEmpty() && dto.getListaDetalles().size() > 0) {
                return true;
            } else {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("doc.compra.mensaje.no.detalles"));
            }
        } else {
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("doc.compra.mensaje.no.detalles"));
        }
        return false;
    }

    public SelectItem[] siEstadosDocumentoCompraTodos() {
        SelectItem[] si = new SelectItem[5];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ELABORACION, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_ELABORACION);
        si[1] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_ANULADO);
        si[2] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_CONFIRMADO);
        si[3] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONTABILIZADO, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_CONTABILIZADO);
        si[4] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_TODOS, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_TODOS);
        return si;
    }

    public SelectItem[] siEstadosDocumentoCompraContaTodos() {
        SelectItem[] si = new SelectItem[3];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_CONFIRMADO);
        si[1] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONTABILIZADO, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_CONTABILIZADO);
        si[2] = new SelectItem(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_TODOS, ConstantesComp.ValoresConstantes.DOC_COMPRA_DESC_ESTADO_TODOS);

        return si;
    }

    public SelectItem[] siDocTransaccion() {
        SelectItem[] si = new SelectItem[4];
        si[0] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_FAC, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_FAC);
        si[1] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_BOL, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_BOL);
        si[2] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_LIQ_COMPRA, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_LIQ_COMPRA);
        si[3] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_GUIA, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_GUIA);
        return si;
    }

    public BigDecimal obtenerSubTotalAtendidoPorPC(PedidoCompraDto pcDto) {
        BigDecimal subTotal = BigDecimal.ZERO;
        try {
            List<DocumentoCompraDto> lstDocCompra = obtenerDocumentosConfirmadosPorPedidoCompra(pcDto);
            if (lstDocCompra != null) {
                if (!lstDocCompra.isEmpty()) {
                    for (DocumentoCompraDto padre : lstDocCompra) {
                        subTotal = subTotal.add(padre.getSubTotal());
                    }
                }
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return subTotal;
    }

    public DocumentoCompraDto generarDatosDocumentoCompra(PedidoCompraDto pcDto) {
        DocumentoCompraDto dcDto = inicializar();

        dcDto.setListaDetalles(new ArrayList<DocumentoCompraDetaDto>());
        dcDto.setPedidoCompraDto(pcDto);
        dcDto.setProveedorDto(pcDto.getProveedorDto());
        dcDto.setDescuento(pcDto.getDescuento());
        dcDto.setDireccion(pcDto.getDireccion());
        dcDto.setTarifaDto(pcDto.getTarifaDto());
        dcDto.setCondicionPagoDto(pcDto.getCondicionPagoDto());
        dcDto.setFormaPagoDto(pcDto.getFormaPagoDto());
        dcDto.setMonedaDto(pcDto.getMonedaDto());

        DocumentoCompraDetaDto dcdDto = null;
        int count = 0;
        BigDecimal subTotalOrigen = pcDto.getSubTotal();
        //Verificamos si existen documentos de compra asociados a este pedido
        BigDecimal subTotalAtendido = obtenerSubTotalAtendidoPorPC(pcDto);
        int indicador = 0; //0:AT, 1:PE y 2:AP 
        if (pcDto.getEstadoDocumento().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_PE)) {
            indicador = 1;
        } else if (pcDto.getEstadoDocumento().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_AP)) {
            indicador = 2;
        }
        for (PedidoCompraDetaDto x : pcDto.getListaDetalles()) {
            count++;
            dcdDto = new DocumentoCompraDetaDto();
            dcdDto.setIsSave(Boolean.TRUE);
            dcdDto.setDocumentoCompraDto(dcDto);
            dcdDto.setItem(count);
            dcdDto.setProductoDetaDto(x.getProductoDetaDto());
            dcdDto.setUnidadMedidaDto(x.getUnidadMedidaDto());
            dcdDto.setCantidad(x.getCantidad());
            dcdDto.setPrecioUnitarioO(x.getPrecioUnitarioO());
            dcdDto.setMonedaODto(x.getMonedaDto());
            dcdDto.setTarifaDto(x.getTarifaDto());
            dcdDto.setTipoCambioDto(x.getTipoCambioDto());
            dcdDto.setFactorConversion(x.getFactorConversion());
            dcdDto.setPrecioUnitarioD(x.getPrecioUnitarioD());
            dcdDto.setDescuento(x.getDescuento());
            dcDto.setSubTotal(pcDto.getSubTotal().subtract(pcDto.getSubTotalAtendido()));
            if (dcdDto.getPrecioUnitarioD() != null) {
                dcdDto.setDescuentoMonto(UtilCore.Numero.dividir(dcdDto.getPrecioUnitarioD().multiply(dcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
                dcdDto.setPrecioUnitarioF(dcdDto.getPrecioUnitarioD().subtract(dcdDto.getDescuentoMonto()));
                //Verificamos si hay que calcular la cantidad que falta atender
                dcdDto.setFactorPago(UtilCore.Numero.dividir(x.getSubTotal(), subTotalOrigen, applicationMBean.getPrecisionDecimales()));
                //Calculamos el subTotalParcial
                if (indicador == 1) {
                    dcdDto.setSubTotalParcial(x.getSubTotal());
                } else if (indicador == 2) {
                    dcdDto.setSubTotalParcial(dcdDto.getFactorPago().multiply(dcDto.getSubTotal()));
                }
                dcdDto.setSubTotal(x.getSubTotal());
            }
            dcdDto.setEstado(ConstantesComp.ValoresConstantes.DOC_COMPRA_DETA_COD_ESTADO_EN_ESPERA);
            dcdDto.setPedidoCompraDetaDto(x);
            dcDto.getListaDetalles().add(dcdDto);
        }
        dcDto = recalcularMontos(dcDto);
        return dcDto;
    }

    public List<TerceroDireccionDto> obtenerDireccionesPrincipales(List<TerceroDireccionDto> lst) {
        List<TerceroDireccionDto> lstAux = new ArrayList<TerceroDireccionDto>();
        for (TerceroDireccionDto x : lst) {
            if (x.getPrincipal()) {
                lstAux.add(x);
            }
        }
        return lstAux;
    }

    public BigDecimal obtenerDescuentoPorProveedor(TerceroDto dto) {
        TerceroDescuentoManager terceroDescuentoManager = (TerceroDescuentoManager) WebServletContextListener.getApplicationContext().getBean("terceroDescuentoManager");
        return terceroDescuentoManager.obtenerDescuentoProveedor(dto);
    }

    public void handleSubTotalParcial(DocumentoCompraDto dto) {
        BigDecimal subtotalConvertido = BigDecimal.ZERO;
        if (verificarSubTotalParcialAtendido(dto)) {
            dto = recalcularMontos(dto);
        } else {
            dto.setSubTotal(dto.getPedidoCompraDto().getSubTotal().subtract(dto.getPedidoCompraDto().getSubTotalAtendido()));
        }
        //Recalcular subtotales parciales
        for (DocumentoCompraDetaDto x : dto.getListaDetalles()) {
            x.setSubTotalParcial(x.getFactorPago().multiply(dto.getSubTotal()));
        }
    }

    public TipoCambioDto obtenerTipoCambioSobreSubTotal(MonedaDto monedaEntrada, MonedaDto monedaSalida) {
        //Verificamos por moneda del doc y moneda del pedido
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TipoCambioManager tipoCambioManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        TipoCambioDto tcDto = null;
        //Verificamos si es necesario usar el tipo de cambio
        if (!monedaEntrada.equals(monedaSalida)) {
            tcDto = tipoCambioManager.obtenerFactorConversionProceso(monedaEntrada, monedaSalida, sessionMBean.getOrganizacionDto().getTcCompra(), 1);
            if (tcDto.getId() == null) {
                return null;
            }
        } else {
            tcDto = new TipoCambioDto(-1L);
        }
        return tcDto;
    }

    //Metodo que hacer el cambio de moneda entre moneda del pedido de compra y moneda del pedido de compra
    //Y verifica que el subtotal atendido en este documento no sea mayor al subtotal que falta atender
    public Boolean verificarSubTotalParcialAtendido(DocumentoCompraDto dto) {
        Boolean resultado = true;
        BigDecimal subTotalConvertido = BigDecimal.ZERO;
        TipoCambioDto tcDto = obtenerTipoCambioSobreSubTotal(dto.getMonedaDto(), dto.getPedidoCompraDto().getMonedaDto());
        if (tcDto != null) {
            if (!tcDto.getId().equals(-1L)) {
                subTotalConvertido = dto.getSubTotal().multiply(tcDto.getFactor());
            } else {
                subTotalConvertido = dto.getSubTotal();
            }
            //Una vez que tenemos unificados los montos debemos verificar que no sea mayor al monto
            //que falta atender del pedido de compra   
            //UtilCore.Numero.round(subTotalConvertido, applicationMBean.getPrecisionDecimales());
            //System.out.println("CONVERTIDO -> " + subTotalConvertido);
            //System.out.println("OTRO -> " + dto.getPedidoCompraDto().getSubTotal().subtract(dto.getPedidoCompraDto().getSubTotalAtendido()));
            //System.out.println("resultado --> " + subTotalConvertido.compareTo(dto.getPedidoCompraDto().getSubTotal().subtract(dto.getPedidoCompraDto().getSubTotalAtendido())));
            if (subTotalConvertido.compareTo(dto.getPedidoCompraDto().getSubTotal().subtract(dto.getPedidoCompraDto().getSubTotalAtendido())) > 0) {
                resultado = false;
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.mensaje.error1"));
            }
        } else {
            resultado = false;
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.mensaje.error2"));
        }
        return resultado;
    }
/*
 * 
 * BigDecimal suma = BigDecimal.ZERO;
        BigDecimal sumaAfecto = BigDecimal.ZERO;
        BigDecimal sumaNoAfecto = BigDecimal.ZERO;
        BigDecimal sub = BigDecimal.ZERO;
        BigDecimal bd100 = BigDecimal.valueOf(100);
        BigDecimal bdN = BigDecimal.valueOf(-1);
        for (DocumentoCompraDetaDto x : dto.getListaDetalles()) {
            suma = suma.add(x.getSubTotal());
            if (x.getIndAfectoIgv()) {
                sub =  x.getSubTotal().multiply(x.getPorcAfecto());
                sub = UtilCore.Numero.dividir(sub,bd100,applicationMBean.getPrecisionDecimales());
                sumaAfecto = sumaAfecto.add(sub);
                sub = sub.multiply(bdN);
                sumaNoAfecto = sumaNoAfecto.add(x.getSubTotal().add(sub));
                
            }else {
                sumaNoAfecto = sumaNoAfecto.add(x.getSubTotal());
            }
        }
        dto.setMontoAfecto(sumaAfecto);
        dto.setMontoNoAfecto(sumaNoAfecto);
 */
    public DocumentoCompraDto recalculardatosPorMoneda(DocumentoCompraDto dto) {
        List<DocumentoCompraDetaDto> lstDetalles = new ArrayList<DocumentoCompraDetaDto>();
        BigDecimal subTotal = BigDecimal.ZERO;
        DocumentoCompraDetaDto dcDto = null;
        BigDecimal sumaAfecto = BigDecimal.ZERO;
        BigDecimal sumaNoAfecto = BigDecimal.ZERO;
        BigDecimal sub = BigDecimal.ZERO;
        BigDecimal bd100 = BigDecimal.valueOf(100);
        BigDecimal bdN = BigDecimal.valueOf(-1);
        for (int i = 0; i < dto.getListaDetalles().size(); i++) {
            dcDto = realizarConversionYCalculoMontos(dto.getListaDetalles().get(i), dto);
            subTotal = subTotal.add(dcDto.getSubTotal());
            if (dto.getListaDetalles().get(i).getIndAfectoIgv()) {
                sub =  dto.getListaDetalles().get(i).getSubTotal().multiply(dto.getListaDetalles().get(i).getPorcAfecto());
                sub = UtilCore.Numero.dividir(sub,bd100,applicationMBean.getPrecisionDecimales());
                sumaAfecto = sumaAfecto.add(sub);
                sub = sub.multiply(bdN);
                sumaNoAfecto = sumaNoAfecto.add(dto.getListaDetalles().get(i).getSubTotal().add(sub));
                
            }else {
                sumaNoAfecto = sumaNoAfecto.add(dto.getListaDetalles().get(i).getSubTotal());
            }
            lstDetalles.add(dcDto);
        }
        dto.setListaDetalles(lstDetalles);
        dto.setSubTotal(subTotal);
        dto.setMontoAfecto(sumaAfecto);
        dto.setMontoNoAfecto(sumaNoAfecto);
        dto = recalcularMontos(dto);
        
        return dto;
    }

    public BigDecimal sumarSubTotalesDetalle(DocumentoCompraDto dto) {
        BigDecimal suma = BigDecimal.ZERO;
        BigDecimal sumaAfecto = BigDecimal.ZERO;        
        for (DocumentoCompraDetaDto x : dto.getListaDetalles()) {
            suma = suma.add(x.getSubTotal());
            if (x.getIndAfectoIgv()&& !x.getPorcAfecto().equals(BigDecimal.valueOf(100))) {
               sumaAfecto = sumaAfecto.add(UtilCore.Numero.aplicarPorcentaje(x.getSubTotal(), x.getPorcAfecto(), applicationMBean.getPrecisionDecimales()));
            }else if (x.getIndAfectoIgv()){
               sumaAfecto = sumaAfecto.add(x.getSubTotal());
            }
        }        
        dto.setMontoAfecto(sumaAfecto);
        dto.setMontoNoAfecto(suma.subtract(dto.getMontoAfecto()));
        
        return suma;
    }

    public Boolean verificarEliminarDetalle(DocumentoCompraDto dto) {
        if (dto.getPedidoCompraDto() != null) {
            if (dto.getListaDetalles().size() == 1) {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.eliminar.deta.origenes.doc.comp"));
                return false;
            }
        }
        return true;
    }

    public DocumentoCompraDto recalcularMontos(DocumentoCompraDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        if (dto.getSubTotal() != null && dto.getDescuento() != null) {
            //Descuento General
            //dto.setDescuentoMonto(UtilCore.Numero.dividir(dto.getSubTotal().multiply(dto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
            dto.setDescuentoMonto(UtilCore.Numero.aplicarPorcentaje(dto.getSubTotal(), dto.getDescuento(), applicationMBean.getPrecisionDecimales()));
            dto.setSubTotalConDescuento(dto.getSubTotal().subtract(dto.getDescuentoMonto()));
            
            //Descuento Parte Afecta
            dto.setDescMontoAfecto(UtilCore.Numero.aplicarPorcentaje(dto.getMontoAfecto(), dto.getDescuento(), applicationMBean.getPrecisionDecimales()));
            dto.setSubTotalConDescuentoAfecto(dto.getMontoAfecto().subtract(dto.getDescMontoAfecto()));
            
            //Descuento Parte No Afecta
            dto.setDescMontoNoAfecto(UtilCore.Numero.aplicarPorcentaje(dto.getMontoNoAfecto(), dto.getDescuento(), applicationMBean.getPrecisionDecimales()));
            dto.setSubTotalConDescuentoNoAfecto(dto.getMontoNoAfecto().subtract(dto.getDescMontoNoAfecto()));
            
        }
        if (dto.getImpuesto() != null && dto.getSubTotalConDescuentoAfecto() != null) {
            dto.setImpuestoMonto(UtilCore.Numero.aplicarPorcentaje(dto.getSubTotalConDescuentoAfecto(), dto.getImpuesto(), applicationMBean.getPrecisionDecimales()));
            dto.setTotal(dto.getSubTotalConDescuentoAfecto().add(dto.getImpuestoMonto().add(dto.getSubTotalConDescuentoNoAfecto())));
            dto.setTotalTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dto.getTotal().doubleValue(), dto.getMonedaDto().getDescripcionTransac()));

        }
        if (dto.getIndDetraccion()) { // hay detraccion
            try {        
                if (dto.getDetraccionDto()!= null)
                    dto.setDetraccionDto(parametroManager.obtenerPorId(ConstantesComp.Parametro.DETRACCION_DEFAULT));
            } catch (DAOException ex) {
                dto.setDetraccionDto(new ParametroDto(ConstantesComp.Parametro.DETRACCION_DEFAULT));
            }            
        }else if (sessionMBean.getOrganizacionDto().getIndRetenedor()) { // es agente retenedor
            dto.setIndRetencion(Boolean.TRUE);
            dto.setPorcentajeDetRet(sessionMBean.getOrganizacionDto().getPaisDto().getRetencion());
        }else {
            dto.setIndDetraccion(Boolean.FALSE);
            dto.setIndRetencion(Boolean.FALSE);
            dto.setPorcentajeDetRet(BigDecimal.ZERO);
            
        }
        
         if (dto.getPorcentajeDetRet() != null) {
            if (dto.getPorcentajeDetRet() != BigDecimal.ZERO) {
    //            this.dto.setTotal(this.dto.getTotal().add(this.dto.getMontoDetraccion()));
                dto.setMontoDetRet(UtilCore.Numero.aplicarPorcentaje(dto.getTotal(),dto.getPorcentajeDetRet(),applicationMBean.getPrecisionDecimales()) );
                dto.setTotalConDetRet(dto.getTotal().subtract(dto.getMontoDetRet()));
                dto.setTotalConDetRetTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dto.getTotalConDetRet().doubleValue(), dto.getMonedaDto().getDescripcionTransac()));            
            }else {                
                dto.setMontoDetRet(BigDecimal.ZERO);
                dto.setTotalConDetRet(dto.getTotal());
                dto.setTotalConDetRetTexto(dto.getTotalTexto());            
            }
        }
        else {
            dto.setMontoDetRet(BigDecimal.ZERO);
            dto.setTotalConDetRet(dto.getTotal());
            dto.setTotalConDetRetTexto(dto.getTotalTexto());            
        }
        return dto;
    }

    public DocumentoCompraDetaDto unificarDatosPedidoCompraDetalle(DocumentoCompraDetaDto dcdDto, DocumentoCompraDto pcDto) {
        TarifaProductoManager tarifaProductoManager = (TarifaProductoManager) WebServletContextListener.getApplicationContext().getBean("tarifaProductoManager");
        try {
            //Activamos el flag del producto
            dcdDto.setIsSave(Boolean.TRUE);
            TarifaProductoDto tpcDto = tarifaProductoManager.obtenerTarifaProductoVigenteAuxiliar(dcdDto.getProductoDetaDto());
            if (tpcDto != null) {
                dcdDto.setTarifaDto(tpcDto.getTarifaDto());
                dcdDto.setMonedaODto(tpcDto.getMonedaCompraDto());
                dcdDto.setPrecioUnitarioO(tpcDto.getMontoCompra());
            } else {
                dcdDto.setTarifaDto(null);
                dcdDto.setMonedaODto(dcdDto.getProductoDetaDto().getMonedaCompraDto());
                dcdDto.setPrecioUnitarioO(dcdDto.getProductoDetaDto().getPrecioCompra());
                //recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sol.copmra.deta.mensaje.no.tarifa.prod"));
            }
            dcdDto.setDescuento(dcdDto.getProductoDetaDto().getDescuentoCompra());
            dcdDto = realizarConversionYCalculoMontos(dcdDto, pcDto);
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return dcdDto;
    }

    public DocumentoCompraDetaDto realizarConversionYCalculoMontos(DocumentoCompraDetaDto dcdDto, DocumentoCompraDto pcDto) {
        //Verificamos si es necesario aplicar el tipo de cambio
        dcdDto.setIsSave(Boolean.TRUE);
        TipoCambioDto tcDto = verificarMonedas(dcdDto, pcDto);
        if (tcDto == null) {
            dcdDto.setTipoCambioDto(null);
            dcdDto.setFactorConversion(null);
            dcdDto.setIsSave(Boolean.FALSE);
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod") + " : " + dcdDto.getProductoDetaDto().getProductoDto().getDescripcion());
        } else if (tcDto.getId().equals(-1L)) {
            dcdDto.setTipoCambioDto(null);
            dcdDto.setFactorConversion(null);
            dcdDto.setPrecioUnitarioD(dcdDto.getPrecioUnitarioO());
            dcdDto.setDescuentoMonto(UtilCore.Numero.dividir(dcdDto.getPrecioUnitarioD().multiply(dcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
        } else {
            dcdDto.setTipoCambioDto(tcDto);
            dcdDto.setFactorConversion(tcDto.getFactor());
            dcdDto.setPrecioUnitarioD(dcdDto.getPrecioUnitarioO().multiply(tcDto.getFactor()));
            dcdDto.setDescuentoMonto(UtilCore.Numero.dividir(dcdDto.getPrecioUnitarioD().multiply(dcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
        }
        dcdDto.setPrecioUnitarioF(dcdDto.getPrecioUnitarioD().subtract(dcdDto.getDescuentoMonto()));
        dcdDto.setUnidadMedidaDto(dcdDto.getProductoDetaDto().getUnidadMedidaDto());
        dcdDto.setSubTotal(dcdDto.getPrecioUnitarioF().multiply(dcdDto.getCantidad()));
        return dcdDto;
    }

    public TipoCambioDto verificarMonedas(DocumentoCompraDetaDto dcdDto, DocumentoCompraDto pcDto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TipoCambioManager tipoCambioManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        TipoCambioDto tcDto = null;
        //Verificamos si es necesario usar el tipo de cambio
        if (!dcdDto.getMonedaODto().getId().equals(pcDto.getMonedaDto().getId())) {
            tcDto = tipoCambioManager.obtenerFactorConversionProceso(dcdDto.getMonedaODto(), pcDto.getMonedaDto(), sessionMBean.getOrganizacionDto().getTcCompra(), 1);

            if (tcDto.getId() == null) {
                return null;
            }
        } else {
            tcDto = new TipoCambioDto(-1L);
        }
        return tcDto;
    }

    public void reordenarDetalles(DocumentoCompraDto dto) {
        List<DocumentoCompraDetaDto> lstDetalles = dto.getListaDetalles();
        DocumentoCompraDetaManager documentoCompraDetaManager = (DocumentoCompraDetaManager) WebServletContextListener.getApplicationContext().getBean("documentoCompraDetaManager");
        try {
            UtilCore.General.ordena(lstDetalles, "item");
            int count = 0;
            for (DocumentoCompraDetaDto d : lstDetalles) {
                count++;
                d.setItem(count);
            }
            if (dto.getId() != null) {
                documentoCompraDetaManager.nuevoMuchos(lstDetalles);
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }

    public void reordenarPlanPagos(List<PlanPagoDto> lstPlanPago) {
        PlanPagoManager planPagoManager = (PlanPagoManager) WebServletContextListener.getApplicationContext().getBean("planPagoManager");
        try {
            UtilCore.General.ordena(lstPlanPago, "orden");
            int count = 0;
            for (PlanPagoDto p : lstPlanPago) {
                count++;
                p.setOrden(count);
            }
            planPagoManager.nuevoMuchos(lstPlanPago);
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }

    public void verificarMontoLiquidarPago(DocumentoCompraDto dto, PlanPagoDto planPagoDto) {
        try {
            PlanPagoManager planPagoManager = (PlanPagoManager) WebServletContextListener.getApplicationContext().getBean("planPagoManager");
            planPagoDto.setIsSave(Boolean.TRUE);
            BigDecimal monto = planPagoManager.obtenerSumaMontosALiquidar(dto, planPagoDto);
            
            
            if (monto == null) {
                monto = BigDecimal.ZERO;
            }
            monto = monto.add(planPagoDto.getLiquidar());
            if (monto.compareTo(dto.getTotalConDetRet()) > 0) {
                planPagoDto.setIsSave(Boolean.FALSE);
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("plan.pago.mensaje.sobrepaso.total"));
            }

        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }
    
    public BigDecimal obtenerMontoPendienteLiquidar(DocumentoCompraDto dto, PlanPagoDto planPagoDto) {
        try {
            PlanPagoManager planPagoManager = (PlanPagoManager) WebServletContextListener.getApplicationContext().getBean("planPagoManager");
            planPagoDto.setIsSave(Boolean.TRUE);
            BigDecimal monto = planPagoManager.obtenerSumaMontosALiquidar(dto, planPagoDto);
            
            if (monto == null) {
                monto = BigDecimal.ZERO;
            }
           // monto = monto.add(planPagoDto.getLiquidar());
            
            return dto.getTotalConDetRet().subtract(monto);
            
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
            return BigDecimal.ZERO;
        }
    }


    public String imprimirDto(DocumentoCompraDto dto) {
        try {
            String nombreArchivoReporte = "ERP_DOCUMENTO_COMPRA_NRO_" + dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_IDENTIFICADOR", dto.getId());
            recursosManager.viewReportePdf(parametros, "JDocumentoCompra", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            recursosManager.showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            recursosManager.showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }

    public void generarExcelSeleccionados(ExportarExcelCompras.DocumentoCompra exp, DocumentoCompraDto[] selectedDCs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<DocumentoCompraDto> lst = Arrays.asList(selectedDCs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "DOCUMENTO_COMPRA_" + UtilCore.Fecha.obtenerFechaActual().replace(":", "_") + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    public void generarExcelPorTabla(ExportarExcelCompras.DocumentoCompra exp, List<DocumentoCompraDto> lstDC) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstDC);
        String nombreArchivo = "DOCUMENTO_COMPRA_" + UtilCore.Fecha.obtenerFechaActual().replace(":", "_") + ".xls";
        System.out.println(strCabecera);
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    private List obtenerCuerpoExcel(ExportarExcelCompras.DocumentoCompra exp, List<DocumentoCompraDto> lst) {
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for (DocumentoCompraDto x : lst) {
            strCuerpo = new StringBuilder();
            if (exp.getId()) {
                strCuerpo.append(x.getId()).append("|");
            }
            if (exp.getEmpresa()) {
                strCuerpo.append(x.getEmpresaDto().getDescripcion()).append("|");
            }
            if (exp.getOrganizacion()) {
                strCuerpo.append(x.getOrganizacionDto().getNombre()).append("|");
            }
            if (exp.getDocumentoTransaccion()) {
                strCuerpo.append(x.getDocTransaccionTexto()).append("|");
            }
            if (exp.getFechaFactura()) {
                strCuerpo.append(x.getFechaFactura()).append("|");
            }
            if (exp.getProveedor()) {
                strCuerpo.append(x.getProveedorDto().getDescripcion()).append("|");
            }
            if (exp.getDireccion()) {
                if (x.getDireccion() != null) {
                    strCuerpo.append(x.getDireccion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getTarifa()) {
                strCuerpo.append(x.getTarifaDto().getNombre()).append("|");
            }
            if (exp.getFechaContable()) {
                strCuerpo.append(x.getFechaContable()).append("|");
            }
            if (exp.getCondicionPago()) {
                strCuerpo.append(x.getCondicionPagoDto().getDescripcion()).append("|");
            }
            if (exp.getFormaPago()) {
                strCuerpo.append(x.getFormaPagoDto().getDescripcion()).append("|");
            }
            if (exp.getPedidoCompra()) {
                if (x.getPedidoCompraDto() != null) {
                    strCuerpo.append(x.getPedidoCompraDto().getId()).append("/");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getReferenciaProveedor()) {
                if (x.getReferenciaProveedor() != null) {
                    strCuerpo.append(x.getReferenciaProveedor()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getDescripcion()) {
                if (x.getDescripcion() != null) {
                    strCuerpo.append(x.getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getGuiaCompra()) {
                if (x.getGuiaCompra() != null) {
                    strCuerpo.append(x.getGuiaCompra()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioCreacion()) {
                if (x.getUsuarioCreacionDto() != null) {
                    strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaCreacion()) {
                if (x.getFechaCreacion() != null) {
                    strCuerpo.append(x.getFechaCreacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getTerminalCreacion()) {
                if (x.getTerminalCreacion() != null) {
                    strCuerpo.append(x.getTerminalCreacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getEstado()) {
                strCuerpo.append(x.getEstadoTexto()).append("|");
            }
            if (exp.getUsuarioConfirmacion()) {
                if (x.getUsuarioConfirmacionDto() != null) {
                    strCuerpo.append(x.getUsuarioConfirmacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaConfirmacion()) {
                if (x.getFechaConfirmacion() != null) {
                    strCuerpo.append(x.getFechaConfirmacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioAnulacion()) {
                if (x.getUsuarioAnulacionDto() != null) {
                    strCuerpo.append(x.getUsuarioAnulacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaAnulacion()) {
                if (x.getFechaAnulacion() != null) {
                    strCuerpo.append(x.getFechaAnulacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getNroSerie()) {
                if (x.getNroSerie() != null) {
                    strCuerpo.append(x.getNroSerie()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getMoneda()) {
                strCuerpo.append(x.getMonedaDto().getDescripcion()).append("|");
            }
            if (exp.getSubTotal()) {
                strCuerpo.append(x.getSubTotal()).append("|");
            }
            if (exp.getDescuento()) {
                strCuerpo.append(x.getDescuento()).append("|");
            }
            if (exp.getDescuentoMonto()) {
                strCuerpo.append(x.getDescuentoMonto()).append("|");
            }
            if (exp.getSubTotalConDescuento()) {
                strCuerpo.append(x.getSubTotalConDescuento()).append("|");
            }
            if (exp.getImpuesto()) {
                strCuerpo.append(x.getImpuesto()).append("|");
            }
            if (exp.getImpuestoMonto()) {
                strCuerpo.append(x.getImpuestoMonto()).append("|");
            }
            if (exp.getTotal()) {
                strCuerpo.append(x.getTotal()).append("|");
            }
            if (exp.getTotalTexto()) {
                strCuerpo.append(x.getTotalTexto()).append("|");
            }
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }

    private StringBuilder obtenerCabeceraExcel(ExportarExcelCompras.DocumentoCompra exp) {
        StringBuilder strCabecera = new StringBuilder();
        if (exp.getId()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.id")).append("|");
        }
        if (exp.getEmpresa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.empresa")).append("|");
        }
        if (exp.getOrganizacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.organizacion")).append("|");
        }
        if (exp.getDocumentoTransaccion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.doc.transaccion")).append("|");
        }
        if (exp.getFechaFactura()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.fecha.factura")).append("|");
        }
        if (exp.getProveedor()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.proveedor")).append("|");
        }
        if (exp.getDireccion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.direccion")).append("|");
        }
        if (exp.getTarifa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.tarifa")).append("|");
        }
        if (exp.getFechaContable()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.fecha.contable")).append("|");
        }
        if (exp.getCondicionPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.condicion.pago")).append("|");
        }
        if (exp.getFormaPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.forma.pago")).append("|");
        }
        if (exp.getPedidoCompra()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.pedido.compra")).append("|");
        }
        if (exp.getReferenciaProveedor()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.ref.proveedor")).append("|");
        }
        if (exp.getDescripcion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.descripcion")).append("|");
        }
        if (exp.getGuiaCompra()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.guia")).append("|");
        }
        if (exp.getUsuarioCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.usuario.creacion")).append("|");
        }
        if (exp.getFechaCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.fecha.creacion")).append("|");
        }
        if (exp.getTerminalCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.terminal.creacion")).append("|");
        }
        if (exp.getEstado()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.estado")).append("|");
        }
        if (exp.getUsuarioConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.usuario.confirmacion")).append("|");
        }
        if (exp.getFechaConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.fecha.confirmacion")).append("|");
        }
        if (exp.getUsuarioAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.usuario.anulacion")).append("|");
        }
        if (exp.getFechaAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.fecha.anulacion")).append("|");
        }
        if (exp.getNroSerie()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.nro.serie")).append("|");
        }
        if (exp.getMoneda()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.moneda")).append("|");
        }
        if (exp.getSubTotal()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.sub.total")).append("|");
        }
        if (exp.getDescuento()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.descuento")).append("|");
        }
        if (exp.getDescuentoMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.descuento.monto")).append("|");
        }
        if (exp.getSubTotalConDescuento()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.subtot.con.descuento")).append("|");
        }
        if (exp.getImpuesto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.impuesto")).append("|");
        }
        if (exp.getImpuestoMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.impuesto.monto")).append("|");
        }
        if (exp.getTotal()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.total")).append("|");
        }
        if (exp.getTotalTexto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("documento.compra.total.texto")).append("|");
        }
        return strCabecera;
    }

    public ExportarExcelCompras.DocumentoCompra onChangeChekExcel(Boolean flag) {
        return new ExportarExcelCompras.DocumentoCompra(flag);
    }

    public void nuevoMuchos(List<DocumentoCompraDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<DocumentoCompraDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        DocumentoCompraManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<DocumentoCompraDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<DocumentoCompraDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public String getUrlListaPedidos() {
        return urlListaPedidos;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public String getUrlCont() {
        return urlCont;
    }

    public String getUrlListaCont() {
        return urlListaCont;
    }
}
